﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using QldtSdh.DAL.Models;

namespace QldtSdh.BLL
{
    class BizDotThi_LopHocPhan
    {
        public static List<DotThi_LopHocPhan> GetList(string idDotThi)
        {
            using (var db = CEMS4UG_DHKHContext.GetContext())
            {
                return db.DotThi_LopHocPhanDbSet.Where(e => e.MaDotThiGUID == idDotThi).OrderByDescending(e => e.LopHocPhan.HocPhan.MaDonViPhuTrachGUID).ToList();
            }
        }

        public static CODE_RESULT_RETURN Add(DotThi_LopHocPhan obj)
        {
            using (var db = CEMS4UG_DHKHContext.GetContext())
            {
                var dtct = db.DotThi_LopHocPhanDbSet.Where(e => e.MaDotThiGUID == obj.MaDotThiGUID && e.MaLopHocPhanGUID == obj.MaLopHocPhanGUID).FirstOrDefault();
                if (dtct != null)
                    return CODE_RESULT_RETURN.MaTrung;
                /*
                 * Thêm lớp học phần vào đợt thi
                 */
                db.DotThi_LopHocPhanDbSet.Add(obj);
                NhatKyHoatDong nhatKy = new NhatKyHoatDong();
                BizNhatKyHoatDong.InitData<DotThi_LopHocPhan>(nhatKy, null, obj.MaDotThiGUID + "-" + obj.MaLopHocPhanGUID, LOAIDOITUONG.CHI_TIẾT_ĐỢT_THI, LOAITHAOTAC.Thêm);
                BizNhatKyHoatDong.Add<DotThi_LopHocPhan>(nhatKy, obj);
                /*
                 * Thêm bảng điểm cho lớp học phần trong đợt thi này
                 * Với trạng thái chưa nhập điểm
                 */

                //Lấy danh sách bảng điểm của lớp học phần
                var bdTruoc = db.LopHocPhan_BangDiemDbSet.Where(e => e.MaLopHocPhanGUID == obj.MaLopHocPhanGUID).ToList();

                LopHocPhan_BangDiem bd = new LopHocPhan_BangDiem();
                bd.MaBangDiemGUID = Guid.NewGuid().ToString();
                bd.LanThiLopHocPhan = bdTruoc.Count + 1;
                bd.NgayThi = obj.NgayThi;
                bd.GioThi = obj.GioThi;
                bd.MaPhongThi = obj.MaPhongHoc;
                bd.HinhThucThi = obj.HinhThucThi;
                bd.TrangThai = (int)TRANGTHAI_BANGDIEM.CHUANHAPDIEM;
                bd.MaDotThiGUID = obj.MaDotThiGUID;
                bd.MaLopHocPhanGUID = obj.MaLopHocPhanGUID;
                db.LopHocPhan_BangDiemDbSet.Add(bd);
                nhatKy = new NhatKyHoatDong();
                BizNhatKyHoatDong.InitData<LopHocPhan_BangDiem>(nhatKy, null, bd.MaBangDiemGUID, LOAIDOITUONG.BẢNG_ĐIỂM, LOAITHAOTAC.Thêm);
                BizNhatKyHoatDong.Add<LopHocPhan_BangDiem>(nhatKy, bd);

                /*
                 * Nếu thêm bảng điểm cho lớp học phần thành công thì chuyển danh sách học viên dự thi qua bảng
                 * LopHocVien_BangDiem
                 * 
                 */

                //Lấy thông tin của lớp học phần
                var lopHocPhan = db.LopHocPhanDbSet.Where(e => e.MaLopHocPhanGUID == obj.MaLopHocPhanGUID).FirstOrDefault();

                /*
                 * Chỉ lấy những học viên còn nợ hoặc chưa thi trong các lần trước đó.
                 */

                if (lopHocPhan.LopHocPhan_HocVien != null && lopHocPhan.LopHocPhan_HocVien.Count > 0)
                {
                    foreach (var hocVien in lopHocPhan.LopHocPhan_HocVien)
                    {
                        bool isHocVienNo = false;
                        var ketQuaHocTap = db.HocVien_KetQuaHocTapDbSet.Where(e => e.MaHocVien == hocVien.MaHocVien && e.MaHocPhanGUID == hocVien.LopHocPhan.MaHocPhanGUID).FirstOrDefault();
                        if (ketQuaHocTap != null)
                        {
                            if (ketQuaHocTap.DiemHe10 < 5)
                                isHocVienNo = true;
                        }
                        else
                            isHocVienNo = true;
                        if (isHocVienNo)
                        {
                            var lanTinhDiem = db.LopHocPhan_BangDiemHocVienDbSet.Where(e => e.MaHocVien == hocVien.MaHocVien && e.LopHocPhan_BangDiem.MaLopHocPhanGUID == obj.MaLopHocPhanGUID).ToList();
                            LopHocPhan_BangDiemHocVien t = new LopHocPhan_BangDiemHocVien();
                            t.MaGhiNhanDiemThiKetThucHocPhanGUID = Guid.NewGuid().ToString();
                            t.MaBangDiemGUID = bd.MaBangDiemGUID;
                            t.MaHocVien = hocVien.MaHocVien;
                            //Chỉ thêm những học viên thi lại dưới 2 lần
                            if (lanTinhDiem.Count < 2)
                            {
                                t.LanTinhDiem = lanTinhDiem.Count + 1;
                                db.LopHocPhan_BangDiemHocVienDbSet.Add(t);
                                nhatKy = new NhatKyHoatDong();
                                BizNhatKyHoatDong.InitData<LopHocPhan_BangDiemHocVien>(nhatKy, null, t.MaGhiNhanDiemThiKetThucHocPhanGUID, LOAIDOITUONG.CHI_TIẾT_BẢNG_ĐIỂM, LOAITHAOTAC.Thêm);
                                BizNhatKyHoatDong.Add<LopHocPhan_BangDiemHocVien>(nhatKy, t);
                            }
                        }
                    }
                }
                db.SaveChanges();
                return CODE_RESULT_RETURN.ThanhCong;
            }
        }

        public static CODE_RESULT_RETURN Update(DotThi_LopHocPhan obj)
        {
            using (var db = CEMS4UG_DHKHContext.GetContext())
            {
                var dtct = db.DotThi_LopHocPhanDbSet.Where(e => e.MaDotThiGUID == obj.MaDotThiGUID && e.MaLopHocPhanGUID == obj.MaLopHocPhanGUID).FirstOrDefault();
                if (dtct == null)
                    return CODE_RESULT_RETURN.ThatBai;
                NhatKyHoatDong nhatKy = new NhatKyHoatDong();
                BizNhatKyHoatDong.InitData<DotThi_LopHocPhan>(nhatKy, dtct, obj.MaDotThiGUID + "-" + obj.MaLopHocPhanGUID, LOAIDOITUONG.CHI_TIẾT_ĐỢT_THI, LOAITHAOTAC.Chỉnh_sửa);

                dtct.MaPhongHoc = obj.MaPhongHoc;
                dtct.HinhThucThi = obj.HinhThucThi;
                dtct.GioThi = obj.GioThi;
                dtct.NgayThi = obj.NgayThi;
                var bangDiem = db.LopHocPhan_BangDiemDbSet.Where(e => e.MaDotThiGUID == obj.MaDotThiGUID && e.MaLopHocPhanGUID == obj.MaLopHocPhanGUID).FirstOrDefault();
                if (bangDiem != null)
                {
                    NhatKyHoatDong nhatKyBangDiem = new NhatKyHoatDong();
                    BizNhatKyHoatDong.InitData<LopHocPhan_BangDiem>(nhatKyBangDiem, bangDiem, bangDiem.MaBangDiemGUID, LOAIDOITUONG.BẢNG_ĐIỂM, LOAITHAOTAC.Chỉnh_sửa);
                    bangDiem.MaPhongThi = obj.MaPhongHoc;
                    bangDiem.HinhThucThi = obj.HinhThucThi;
                    bangDiem.GioThi = obj.GioThi;
                    bangDiem.NgayThi = obj.NgayThi;
                    BizNhatKyHoatDong.Add<LopHocPhan_BangDiem>(nhatKy, bangDiem);
                }
                db.SaveChanges();
                BizNhatKyHoatDong.Add<DotThi_LopHocPhan>(nhatKy, dtct);
                return CODE_RESULT_RETURN.ThanhCong;
            }
        }

        public static CODE_RESULT_RETURN Delete(string idDotThi, string idLopHocPhan)
        {
            using (var db = CEMS4UG_DHKHContext.GetContext())
            {
                var dt = db.DotThi_LopHocPhanDbSet.Where(e => e.MaDotThiGUID == idDotThi && e.MaLopHocPhanGUID == idLopHocPhan).FirstOrDefault();
                if (dt == null)
                    return CODE_RESULT_RETURN.ThatBai;
                var bangDiem = db.LopHocPhan_BangDiemDbSet.Where(e => e.MaDotThiGUID == idDotThi && e.MaLopHocPhanGUID == idLopHocPhan).FirstOrDefault();
                //Trường hợp đã nhập điểm thì không thể xóa lớp học phần ra khỏi đợt thi được
                if (bangDiem != null && bangDiem.TrangThai != (int)TRANGTHAI_BANGDIEM.CHUANHAPDIEM)
                    return CODE_RESULT_RETURN.ThatBai;
                //Có thể xóa nếu lớp học phần chưa nhập điểm
                /*
                 * Trước khi xóa lớp học phần ra khỏi csdl thì xóa danh sách học viên ra khỏi bảng điểm và
                 * xóa luôn bảng điểm
                 */
                NhatKyHoatDong nhatKy = new NhatKyHoatDong();
                if (bangDiem.LopHocPhan_BangDiemHocVien != null && bangDiem.LopHocPhan_BangDiemHocVien.Count > 0)
                {
                    //Xóa danh sách học viên ra khỏi bảng điểm
                    if (bangDiem.LopHocPhan_BangDiemHocVien.Count > 0)
                    {
                        db.LopHocPhan_BangDiemHocVienDbSet.RemoveRange(bangDiem.LopHocPhan_BangDiemHocVien);
                        //nhatKy = new NhatKyHoatDong();
                        //BizNhatKyHoatDong.InitData<LopHocPhan_BangDiemHocVien>(nhatKy, item, item.MaGhiNhanDiemThiKetThucHocPhanGUID, LOAIDOITUONG.CHI_TIẾT_BẢNG_ĐIỂM, LOAITHAOTAC.Xóa);
                        //BizNhatKyHoatDong.Add<LopHocPhan_BangDiemHocVien>(nhatKy, null);
                    }
                }
                //Xóa bảng điểm
                db.LopHocPhan_BangDiemDbSet.Remove(bangDiem);
                nhatKy = new NhatKyHoatDong();
                BizNhatKyHoatDong.InitData<LopHocPhan_BangDiem>(nhatKy, bangDiem, bangDiem.MaBangDiemGUID, LOAIDOITUONG.BẢNG_ĐIỂM, LOAITHAOTAC.Xóa);
                BizNhatKyHoatDong.Add<LopHocPhan_BangDiemHocVien>(nhatKy, null);
                //Xóa lớp học phần ra khỏi đợt thi
                db.DotThi_LopHocPhanDbSet.Remove(dt);
                db.SaveChanges();
                nhatKy = new NhatKyHoatDong();
                BizNhatKyHoatDong.InitData<DotThi_LopHocPhan>(nhatKy, dt, dt.MaDotThiGUID + "-" + dt.MaLopHocPhanGUID, LOAIDOITUONG.CHI_TIẾT_ĐỢT_THI, LOAITHAOTAC.Xóa);
                BizNhatKyHoatDong.Add<DotThi_LopHocPhan>(nhatKy, null);
                return CODE_RESULT_RETURN.ThanhCong;
            }
        }
    }
}
